﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include <string>
using namespace std;
//2.容器 vector
#include <vector>
//9.使用系统算法的头文件；
#include <algorithm>

//10.操作自定义数据类型；
class PersonVector
{
public:
	PersonVector(string name, int age)
	{
		this->m_Name = name;
		this->m_Age = age;
	}

	string m_Name;
	int m_Age;
};
void myPrintVector(int v)
{
	cout << v << endl;
}
//1.迭代器，遍历功能，用指针理解；普通指针也算是一种迭代器；
void testLterator()
{
	int array[5] = { 1,3,5,6,8 };
	for (int i = 0; i < 5; ++i)
	{
		cout << array[i] << endl;//1,...,8
	}

	int* p = array;
	for (int j = 0; j < 5; ++j)
	{
		cout << *(p++) << endl;////1,...,8
	}

	//3.声明容器；声明一个容器，这个容器中存放int类型数据，对象名称v；
	vector<int> v;
	//4.向容器中加入数据；
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);
	//5.遍历容器中的数据，利用迭代器；
		//itBegin指向的是v容器中的起始位置；
	vector<int>::iterator itBegin = v.begin();
	//6.itEnd指向v容器中最后一个位置的下一个地址；
	vector<int>::iterator itEnd = v.end();

	while (itBegin != itEnd)
	{
		cout << *itBegin << endl;//10,...,40
		itBegin++;
	}

	//7.第二种遍历方式；
	//for (int i = 0; i < 10; ++i)
	for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
	{
		cout << *it << endl;//10,...,40
	}

	//8.第三种方式，利用算法；
	for_each(v.begin(), v.end(), myPrintVector);//10,...,40


	vector<PersonVector> vP;
	PersonVector p1("大头儿子", 10);
	PersonVector p2("小头爸爸", 32);
	PersonVector p3("隔壁王叔叔", 30);
	PersonVector p4("围裙妈妈", 28);

	vP.push_back(p1);
	vP.push_back(p2);
	vP.push_back(p3);
	vP.push_back(p4);

	//11.遍历；
	for (vector<PersonVector>::iterator it = vP.begin(); it != vP.end(); ++it)
	{
		cout << "姓名：" << (*it).m_Name << "，年龄：" << it->m_Age << endl;
	}
	/*姓名：大头儿子，年龄：10
	姓名：小头爸爸，年龄：32
	姓名：隔壁王叔叔，年龄：30
	姓名：围裙妈妈，年龄：28*/

	//12.存放自定义数据类型的指针；
	vector<PersonVector*> vPP;
	PersonVector pp1("大头儿子", 10);
	PersonVector pp2("小头爸爸", 32);
	PersonVector pp3("隔壁王叔叔", 30);
	PersonVector pp4("围裙妈妈", 28);

	vPP.push_back(&p1);
	vPP.push_back(&p2);
	vPP.push_back(&p3);
	vPP.push_back(&p4);

	for (vector<PersonVector*>::iterator it = vPP.begin(); it != vPP.end(); ++it)
	{
		cout << "vPP:姓名：" << (*it)->m_Name << "，年龄：" << (*it)->m_Age << endl;
	}
	//vPP:姓名：大头儿子，年龄：10
	//vPP : 姓名：小头爸爸，年龄：32
	//vPP : 姓名：隔壁王叔叔，年龄：30
	//vPP : 姓名：围裙妈妈，年龄：28

	//13.容器嵌套容器；
	vector<vector<int>> vv;
	vector<int> vi1;
	vector<int> vi2;
	vector<int> vi3;

	for (int i = 0; i < 5; ++i)
	{
		vi1.push_back(i);
		vi2.push_back(i + 10);
		vi3.push_back(i + 100);
	}
	//14.将小容器放入到大容器中；
	vv.push_back(vi1);
	vv.push_back(vi2);
	vv.push_back(vi3);

	//15.遍历所有数据；
	for (vector<vector<int>>::iterator it = vv.begin(); it != vv.end(); ++it)
	{
		for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); ++vit)
		{
			cout << *vit << " ";
		}
		cout << endl;
	}

	/*0 1 2 3 4
	10 11 12 13 14
	100 101 102 103 104*/
}

//main318：STL三大组件
int main318()
{
	testLterator();

	system("pause");
	return EXIT_SUCCESS;
}